#ifndef MATRICE_H
#define MATRICE_H
#include "Vecteur.h"
#include <cmath>
#include <iostream>

class Matrice {

protected:
	
	double elems[4][4];
	
public:

	Matrice(){}
	Matrice(const Point &, const Point &);
	Matrice(const Point &origine, Vecteur &v);
	Matrice(Point &, Vecteur &, Vecteur &);
	~Matrice(){}
	
	double getElem(int i, int j) const { return elems[i][j]; }

	Matrice operator *(const Matrice &);
	Vecteur operator *(const Point &);
	Matrice getTransposee() const;

	static Matrice Matrice::creerTranslation(const Vecteur &v) { // not used
		Matrice m;
		for (int i=0; i < 4; i++) {
			m.elems[0][i] = 0;
			m.elems[1][i] = 0;
			m.elems[2][i] = 0;
			m.elems[3][i] = 0;
			m.elems[i][i] = 1;
		}
		m.elems[0][3] = v.getX();
		m.elems[1][3] = v.getY();
		m.elems[2][3] = v.getZ();
		return m;
	}

	static Matrice Matrice::creerRotation(double angle, int axe) { // not used
		Matrice m;
		if (axe == Vecteur::axeX) {
			m.elems[0][0] = 1;
			m.elems[0][1] = 0;
			m.elems[0][2] = 0;
			m.elems[0][3] = 0;
			m.elems[1][0] = 0;
			m.elems[1][1] = cos(angle);
			m.elems[1][2] = - sin(angle);
			m.elems[1][3] = 0;
			m.elems[2][0] = 0;
			m.elems[2][1] = sin(angle);
			m.elems[2][2] = cos(angle);
			m.elems[2][3] = 0;
			m.elems[3][0] = 0;
			m.elems[3][1] = 0;
			m.elems[3][2] = 0;
			m.elems[3][3] = 1;
		}
		else if (axe == Vecteur::axeY) {
			m.elems[0][0] = cos(angle);
			m.elems[0][1] = 0;
			m.elems[0][2] = sin(angle);
			m.elems[0][3] = 0;
			m.elems[1][0] = 0;
			m.elems[1][1] = 1;
			m.elems[1][2] = 0;
			m.elems[1][3] = 0;
			m.elems[2][0] = - sin(angle);
			m.elems[2][1] = 0;
			m.elems[2][2] = cos(angle);
			m.elems[2][3] = 0;
			m.elems[3][0] = 0;
			m.elems[3][1] = 0;
			m.elems[3][2] = 0;
			m.elems[3][3] = 1;
		}
		else if (axe == Vecteur::axeZ) {
			m.elems[0][0] = cos(angle);
			m.elems[0][1] = - sin(angle);
			m.elems[0][2] = 0;
			m.elems[0][3] = 0;
			m.elems[1][0] = sin(angle);
			m.elems[1][1] = cos(angle);
			m.elems[1][2] = 0;
			m.elems[1][3] = 0;
			m.elems[2][0] = 0;
			m.elems[2][1] = 0;
			m.elems[2][2] = 1;
			m.elems[2][3] = 0;
			m.elems[3][0] = 0;
			m.elems[3][1] = 0;
			m.elems[3][2] = 0;
			m.elems[3][3] = 1;
		}
		return m;
	}

};
#endif